package cn.com.bod.fas.pm.service.impl;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import javax.validation.Valid;

import cn.com.bod.fas.pm.dao.mapper.CuSpecialCustMapper;
import cn.com.bod.fas.pm.exception.CustomerException;
import cn.com.bod.fas.pm.model.po.CuSpecialCust;
import cn.com.bod.fas.pm.model.po.CuSpecialCustWhite;
import cn.com.bod.fas.pm.service.CuSpecialCustService;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import com.github.pagehelper.PageHelper;

import cn.com.bod.fas.common.constant.enumconst.ResultCodeEnum;
import cn.com.yusys.yusp.commons.mapper.CommonMapper;
import cn.com.yusys.yusp.commons.mapper.QueryModel;
import cn.com.yusys.yusp.commons.service.CommonService;

/**
 * @description 特殊客户信息Service
 * @author houyaoxun
 * @date 2019年9月24日
 * @version 1.0.0
 * @Copyright (c) scfhdt
 */
@Service
public class CuSpecialCustServiceImpl extends CommonService implements CuSpecialCustService {
	@Autowired
	private CuSpecialCustMapper cuSpecialCustMapper;

	@Override
	protected CommonMapper<?> getMapper() {
		return cuSpecialCustMapper;
	}

	public static final int ONEENUM = 1;
	public static final int TOWENUM = 2;
	public static final int THREEENUM = 3;
	public static final int FOURENUM = 4;
	public static final int FIVEENUM = 5;
	public static final int SIXENUM = 6;

	/*
	 * @description 新增白名单客户
	 * 
	 * @author houyaoxun
	 * 
	 * @date 2019年9月16日
	 * 
	 * @param cust 白名单客户bean void
	 */
	@Override
	@Transactional(rollbackFor = { Exception.class })
	public void addWhiteCust(CuSpecialCust cust) {
		// TODO 自动生成的方法存根

		insertSelective(getMapper(), cust);
	}

	/*
	 * @description 查询白名单客户列表
	 * 
	 * @author houyaoxun
	 * 
	 * @date 2019年9月16日
	 * 
	 * @param model
	 * 
	 * @return List<Map<String,Object>>
	 */
	@Override
	public List<CuSpecialCust> getListByModel(QueryModel model) {
		// TODO 自动生成的方法存根

		List<CuSpecialCust> list = null;
		PageHelper.startPage(model.getPage(), model.getSize());
		list = cuSpecialCustMapper.getListByModel(model);
		PageHelper.clearPage();
		return list;
	}

	/*
	 * @description 修改白名单客户
	 * 
	 * @author houyaoxun
	 * 
	 * @date 2019年9月16日
	 * 
	 * @param cust 白名单客户bean
	 */
	@Override
	@Transactional(rollbackFor = { Exception.class })
	public void updateWhiteCust(@Valid CuSpecialCust cust) {
		// TODO 自动生成的方法存根
		updateSelective(getMapper(), cust);
	}

	/*
	 * @description 获取excel集合
	 * 
	 * @author houyaoxun
	 * 
	 * @date 2019年9月16日
	 * 
	 * @param file
	 * 
	 * @return Workbook
	 */
	public Workbook getWorkBook(MultipartFile file) {
		// 获得文件名
		String fileName = file.getOriginalFilename();
		// 创建Workbook工作薄对象，表示整个excel
		Workbook workbook = null;
		try {
			// 获取excel文件的io流
			InputStream inpu = file.getInputStream();
			// 根据文件后缀名不同(xls和xlsx)获得不同的Workbook实现类对象
			if (fileName.endsWith("xls")) {
				// 2003
				POIFSFileSystem is = new POIFSFileSystem(inpu);
				workbook = new HSSFWorkbook(is);
			} else if (fileName.endsWith("xlsx")) {
				// 2007 及2007以上
				workbook = new XSSFWorkbook(inpu);
			}
		} catch (IOException e) {
			throw new CustomerException(ResultCodeEnum.ERROR);
		}
		return workbook;
	}

	/*
	 * @description 批量导入白名单客户
	 * 
	 * @author houyaoxun
	 * 
	 * @date 2019年9月16日
	 * 
	 * @param file
	 * 
	 * @param model JSON格式参数
	 * 
	 * @return Map<String,Object>
	 */
	@Override
	@Transactional(rollbackFor = { Exception.class })
	public String importSpecialCust(MultipartFile file) {
		// 获得Workbook工作薄对象
		Workbook workbook = getWorkBook(file);
		if (workbook != null) {
			// 获得当前sheet工作表
			Sheet sheet = workbook.getSheetAt(0);
			/*
			 * 获取从前端传来的当前登录用户信息
			 */
			// String regOperator = userInfoUtil.getUserInfo().getUserId();
			// String regOrg = userInfoUtil.getUserInfo().getOrg().getId();
			// 获得当前sheet的开始行
			int firstRowNum = sheet.getFirstRowNum();
			Row headrow = sheet.getRow(firstRowNum);
			// 获得表头行的开始列
			int headfirstCellNum = headrow.getFirstCellNum();
			/*
			 * 获得表头行的列数，并验证模板是否标准
			 */
			int headlastCellNum = headrow.getPhysicalNumberOfCells();
			String headcells = "";

			for (int k = headfirstCellNum; k < headlastCellNum; k++) {
				headcells += headrow.getCell(k).toString() + ",";

			}
			boolean topNamePer = headcells.equals("客户名称,证件类型,证件号码,列入原因,起始日期,结束日期,");
			if (!topNamePer) {
				return "模板不匹配";
			}
			List<CuSpecialCustWhite> list = new ArrayList<>();
			int lastRowNum = sheet.getLastRowNum();
			// 循环除了第一行的所有行
			for (int rowNum = firstRowNum + 1; rowNum <= lastRowNum; rowNum++) {
				// 获得当前行
				Row row = sheet.getRow(rowNum);
				if (row == null) {
					continue;
				}
				// 获得当前行的开始列
				/*
				 * 组装对象放到集合
				 */
				CuSpecialCustWhite cuSpecialCustWhite = new CuSpecialCustWhite();
				for (int i = 1; i < headlastCellNum; i++) {
					switch (i) {
					case 1:
						cuSpecialCustWhite.setCustName(row.getCell(i).toString());// 获取表格中客户名称
						break;
					case 2:
						cuSpecialCustWhite.setCertTypeId(row.getCell(i).toString());// 获取表格中证件类型
						break;
					case 3:
						cuSpecialCustWhite.setCertNo(row.getCell(i).toString());// 获取表格中证件号
						break;
					case 4:
						cuSpecialCustWhite.setIncludeCause(row.getCell(i).toString());// 获取表格中列入原因
						break;
					case 5:
						cuSpecialCustWhite.setStartDate(row.getCell(i).toString());// 获取表格中开始日期
						break;
					case 6:
						cuSpecialCustWhite.setEndDate(row.getCell(i).toString());// 获取表格中结束日期
						break;
					default:
						break;
					}
				}

				list.add(cuSpecialCustWhite);

			}
			cuSpecialCustMapper.importSpecialCust(list);
			cuSpecialCustMapper.importWhiteToSpecial(1);
			cuSpecialCustMapper.deleteWhite(1);
		}
		return "";
	}

	@Override
	public Integer delWhiteCust(String ids) {
		// TODO 自动生成的方法存根
		return cuSpecialCustMapper.delWhiteCust(ids);
	}

}
